package util

import (
    `math/rand`
    "os"
    "path/filepath"
    "strings"
)

// ExeDir
// 获取可执行文件的目录
func ExeDir() string {
    exePath, err := os.Executable()
    if err != nil {
        return "./"
    }
    return filepath.Dir(exePath)
}

// ExeDirPath
// 获取相对于可执行文件的文件路径
func ExeDirPath(path string) string {
    return filepath.Join(ExeDir(), path)
}

// WorkDir
// 获取工作目录
func WorkDir() string {
    wd, _ := os.Getwd()
    return wd
}

// WorkDirPath
// 获取相对于工作目录的文件路径
func WorkDirPath(path string) string {
    return filepath.Join(WorkDir(), path)
}

// PathFormat
// 格式化路径，如果是绝对路径格式化为标准绝对路径；如果是相对路径格式化为可执行文件的绝对路径
func PathFormat(path string) string {
    path = strings.TrimSpace(path)
    if filepath.IsAbs(path) {
        path = filepath.Clean(path) // 绝对路径
    } else {
        path = WorkDirPath(path) // 相对路径
    }
    return path
}

// RandString
// 随机字符串
func RandString(length int) string {
    charsets := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
    b := make([]byte, length)
    for i := range b {
        b[i] = charsets[rand.Intn(len(charsets))]
    }
    return string(b)
}

// CLIHeader CLI 头部打印内容
func CLIHeader(length int, contents ...string) string {
    var header string
    for _, content := range contents {
        header = header + strings.NewReplacer(
            "{CONTENT}", content,
        ).Replace(
            `+ {CONTENT}
`,
        )
    }
    return strings.NewReplacer(
        "{LINE}", strings.Repeat("-", length),
        "{HEADER}", header,
    ).Replace(
        `
+{LINE}+
{HEADER}+{LINE}+
        `,
    )
}
